package com.coolingme.jdk;

/**
 * String中的享元模式
 *
 * @author wangyue
 * @date 2020-09-16 23:49
 */
public class StringTest {

    public static void main(String[] args) {
        /*
        Java中将String类定义为 final（不可改变的），ⅣM中字符串一般保存在字符串常量池中，java
        会确保一个字符串在常量池中只有一个拷贝，这个字符串常量池在 JDK6.0以前是位于常量池中，位于
        永久代，而在 JDK7.0中，ⅣM将其从永久代拿出来放置于堆中
         */

        String s1 = "hello";
        String s2 = "hello";
        String s3 = "he" + "llo";
        String s4 = "he" + new String("llo");
        String s5 = new String("hello");

        // 获取内存地址
        String s6 = s5.intern();

        String s7 = "he";
        String s8 = "llo";
        String s9 = s7 + s8;

        System.out.println(s1 == s2); // true
        System.out.println(s1 == s3); // true
        System.out.println(s1 == s4); // false
        System.out.println(s1 == s9); // false
        System.out.println(s4 == s5); // false

        /*
        intern（方法能使一个位于堆中的字符串在运行期间动态地加入到字符串常量池中
        （字符串常量池的内容是程序启动的时候就已经加载好了），如果字符串常量池中有该对象对应的字面
        量，则返回该字面量在字符串常量池中的引用，否则，创建复制一份该字面量到字符串常量池并返回它
        的引用。因此s1==s6输出 true。
         */
        System.out.println(s1 == s6); // true

    }

}
